package com.example.micro_property_springboot.service;

import com.example.micro_property_springboot.pojo.AssetCheckPlan;
import com.example.micro_property_springboot.pojo.AssetCheckItem;
import com.example.micro_property_springboot.pojo.AssetCheckDiff;
import com.example.micro_property_springboot.pojo.DTO.request.AssetCheckPlanCreateRequest;
import com.example.micro_property_springboot.pojo.DTO.request.AssetCheckPlanUpdateRequest;
import com.example.micro_property_springboot.pojo.DTO.request.AssetCheckItemRequest;
import com.example.micro_property_springboot.pojo.DTO.request.AssetCheckDiffHandleRequest;
import com.example.micro_property_springboot.pojo.DTO.request.AssetCheckPlanResponse;

import java.util.List;
import java.util.Map;

/**
 * 资产盘点服务接口
 * 提供盘点计划管理、盘点执行和统计分析功能
 */
public interface AssetCheckService {

    // ========== 盘点计划管理 ==========
    /**
     * 创建盘点计划
     * @param request 盘点计划创建请求
     * @return 创建的盘点计划
     */
    AssetCheckPlan createCheckPlan(AssetCheckPlanCreateRequest request);

    /**
     * 更新盘点计划
     * @param planId 计划ID
     * @param request 盘点计划更新请求
     * @return 更新后的盘点计划
     */
    AssetCheckPlan updateCheckPlan(Long planId, AssetCheckPlanUpdateRequest request);

    /**
     * 获取盘点计划详情
     * @param planId 计划ID
     * @return 盘点计划响应
     */
    AssetCheckPlanResponse getCheckPlanDetail(Long planId);

    /**
     * 获取盘点计划列表
     * @param params 查询参数
     * @return 盘点计划列表
     */
    List<AssetCheckPlanResponse> getCheckPlanList(Map<String, Object> params);

    /**
     * 删除盘点计划
     * @param planId 计划ID
     * @return 是否删除成功
     */
    boolean deleteCheckPlan(Long planId);

    // ========== 盘点执行 ==========
    /**
     * 开始盘点计划
     * @param planId 计划ID
     * @return 是否开始成功
     */
    boolean startCheckPlan(Long planId);

    /**
     * 结束盘点计划
     * @param planId 计划ID
     * @return 是否结束成功
     */
    boolean finishCheckPlan(Long planId);

    /**
     * 标记资产已盘点
     * @param request 盘点明细操作请求
     * @return 是否操作成功
     */
    boolean markAssetChecked(AssetCheckItemRequest request);

    /**
     * 获取盘点明细列表
     * @param planId 计划ID
     * @return 盘点明细列表
     */
    List<AssetCheckItem> getCheckItems(Long planId);

    // ========== 盘点差异处理 ==========
    /**
     * 获取盘点差异列表
     * @param planId 计划ID
     * @return 盘点差异列表
     */
    List<AssetCheckDiff> getCheckDiffs(Long planId);

    /**
     * 处理盘点差异
     * @param diffId 差异ID
     * @param request 差异处理请求
     * @return 是否处理成功
     */
    boolean handleCheckDiff(Long diffId, AssetCheckDiffHandleRequest request);

    // ========== 盘点报表和统计 ==========
    /**
     * 获取盘点记录报表
     * @param params 查询参数
     * @return 盘点记录报表数据
     */
    List<Map<String, Object>> getCheckRecordReport(Map<String, Object> params);

    /**
     * 获取盘点统计分析数据
     * @param planId 计划ID
     * @return 盘点统计分析数据
     */
    Map<String, Object> getCheckStatistics(Long planId);

    /**
     * 获取部门盘点情况统计
     * @return 部门盘点情况统计
     */
    List<Map<String, Object>> getDeptCheckStatistics();

    /**
     * 获取盘点完成率趋势
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 盘点完成率趋势数据
     */
    List<Map<String, Object>> getCheckCompletionRateTrend(String startDate, String endDate);
}